package com.sykj.common;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;



@Aspect     //被<aop:aspectj-autoproxy>这个标签识别
//@Component  //被<context:component-scan> 标签扫描到，
			//自动载如Spring管理器
@Component //默认创建的别名是 logAOP
public class LogAOP {
	
	@Autowired
	RedisTemplate redistemplate;
	
	//创建静态日志对象
	static Logger log = Logger.getLogger(LogAOP.class);
	/**
	 * 第一个 *  : 任意方法的返回类型
	 * 第2个*: 任意类名+Impl字符
	 * 第3个*: 任意方法名
	 * 第4个.. : 任意数量的方法参数
	 * @param point 切人点
	 */
	/**/
	@Before("execution(* com.sykj.service.*ImpI.add*(..)) ||execution(* com.sykj.service.*ImpI.delete*(..))||execution(* com.sykj.service.*ImpI.update*(..))")
	public void beforeLog(JoinPoint point){
		log.debug("执行了前置拦截，调用了方法名："+point.getSignature().getName()+"参数是"+Arrays.toString(point.getArgs()));
	}
	
//	@After("execution(* com.sykj.service.*ImpI.*(..))")
	public void afterLog(JoinPoint point){
		log.debug("执行了后置拦截，调用了方法名："+point.getSignature().getName()+"参数是"+Arrays.toString(point.getArgs()));
	}
	/**
	 * 环绕通知
	 * @param joinPoint切入点
	 * @throws Throwable
	 */
//	@Around("execution(* com.sykj.service.*ImpI.get*(..))")
	public Object aroundLog(ProceedingJoinPoint joinPoint) throws Throwable{
		log.debug("执行了前置拦截，调用了方法名："+joinPoint.getSignature().getName()+"参数是"+Arrays.toString(joinPoint.getArgs()));
		//返回的数据
		Object result=null;
		//从Redis库查找相应的内容
		//1.Key是切入点的方法名称+参数内容
		Object object=redistemplate.opsForValue().get(joinPoint.getSignature().getName()+Arrays.toString(joinPoint.getArgs()));

		 
			//表示redis库里还没有缓存起来
			if(object==null){
		    System.out.println("缓存库中没有你要的数据，将从数据库中查找");

			//调用dao层的getall方法
			result=joinPoint.proceed();//2.执行拦截的方法
			//得到数据后，缓存到Redis
			//3.set（key）key变了，key是切入点的方法名称+参数内容
			redistemplate.opsForValue().set(joinPoint.getSignature().getName()+Arrays.toString(joinPoint.getArgs()),result,60,TimeUnit.SECONDS);
            System.out.println("把数据缓存到Redis库中");
			//得到数据
			return result;
		    }else{//否则表示已从Redis缓存库中查出数据，直接返回
		    	System.out.println("已从缓存库中取到数据");
		    	result= object;//4.缓存取到的数据赋值给返回对象
		    	return result;
		    }
		}
		
   
	 
	
}
